﻿//-------------------------------------------------------------------
//	Copyright (c) 2012 Fedotov I.V.
//	All rights reserved.
//-------------------------------------------------------------------
/*
	This program is free software: you can redistribute it and/or modify
	it under the terms of the GNU Lesser General Public License as published by
	the Free Software Foundation, either version 3 of the License, or
	(at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
	GNU Lesser General Public License for more details.

	You should have received a copy of the GNU Lesser General Public License
	along with this program. If not, see http://www.gnu.org/licenses/.

	Project SVN page 
*/

#ifndef __DATACONTAINERBASE_H__
#define __DATACONTAINERBASE_H__

#include <stdio.h>
#include <string.h>
#include <vector>

#include "filecontainer.h"
#include "../sptr.h"
#include "../uniq_id.h"

class DataContainerBase : public UniqID{

private:

	//Сделано как указатель с целью экономии памяти, в случае если контейнер не используется объектом
	//то на него не выделена память, при этом его можно копировать, т.к он будет выделен в своем SPtr
	//по вызове. Копирование SPtr до выделения будет работать, т.к выделение в одном из SPtr объекта
	//будет получено во все копии SPtr
	//Выделяется при вызове join в этом объекте (если не установлен флаг запрета join) либо
	//вызове getFileContainer. Сделано путем автоматического выделения в SPtr при вызове p(), если
	//установлен флаг SPTR_ALLOC_ON_CALL
  SPtr<FileContainer> *fc;
	//0x1 - join enabled
	unsigned long flags;
	
public:

  DataContainerBase();
	DataContainerBase(__int64 _ID);
	~DataContainerBase();

	//возвращает результат проверки на возможность parse (возвращает 1, если нет ошибок)
	//считывает в этот объект данные из внешнего источника
	//(из containerData)
	//_inFileContainer - контейнер с данными (!=CT_CONTAINER), среди данных которого со смещением
	//_offsetInData расположены данные, задаваемые для parse
	int preParse(SPtr<FileContainer> _inFileContainer,long _inOffsetInData, char **_outDataBuf, long *_outDataSize);

	//возвращает 1 если контейнер fc готов к записи данных
	int preJoin();
  //запрещает создание контейнера в join если установить setJoinEnable(0)
	void setJoinEnable(int enable);

	//Возвращает контейнер, хранимый в объекте.
	//Для того чтобы контейнер (fc) получил данные из этого объекта
	//и был готов к сохранению следует вызвать join() (в потомках класса)
	SPtr<FileContainer> getFileContainer();
	int	setFileContainer(SPtr<FileContainer> _fc);

	

};


#endif